
#ifndef TouchLocation_h
#define TouchLocation_h

#include <CSharpPropertyMethods.h>

#include <System/Generic/IEquatable.h>
#include <System/Array.h>

#include <Riccsson/Xna/Framework/Vector2.h>
#include <Riccsson/Xna/Framework/Input/Touch/TouchLocationState.h>

namespace Riccsson
{
	namespace Xna
	{
		namespace Framework
		{
			namespace Input
			{
				namespace Touch
				{
					// Summary:
					//     Provides methods and properties for interacting with a touch location on
					//     a touch screen device. Reference page contains links to related code samples.
					struct TouchLocation
						: Riccsson::System::Generic::IEquatable<TouchLocation>
					{
						// This friends is to make private constructor available for the std::vector.
						friend class std::vector2<TouchLocation>;
						friend class Riccsson::System::Array<TouchLocation>;

						PROP3GET(TouchLocation, int, Id);
						PROP3GET(TouchLocation, Vector2, Position);
						PROP3GET(TouchLocation, TouchLocationState, State);

						int _Id;
						Vector2 _Position;
						TouchLocationState _State;
						
						//--------------------------------------------
						// Copy constructor (Needed for raw struct to get Properties to work).
						// TODO: Can we do this on a better way? :O
						COPY_CONSTRUCTOR(TouchLocation)
						{
							PROP3GET_INIT_COPY(TouchLocation, int, Id);
							PROP3GET_INIT_COPY(TouchLocation, Vector2, Position);
							PROP3GET_INIT_COPY(TouchLocation, TouchLocationState, State);
							_Id = other._Id;
							_Position = other._Position;
							_State = other._State;
						}
						
						//--------------------------------------------
						public: TouchLocation()
							: PROP3GET_INIT(TouchLocation, Id)
							, PROP3GET_INIT(TouchLocation, Position)
							, PROP3GET_INIT(TouchLocation, State)
						{
						}

						//
						// Summary:
						//     Initializes a new TouchLocation with an ID, state, position, and pressure.
						//
						// Parameters:
						//   id:
						//     ID of the new touch location.
						//
						//   state:
						//     State of the new touch location.
						//
						//   position:
						//     Position, in screen coordinates, of the new touch location.
						public: TouchLocation(int id, TouchLocationState state, Vector2 position)
							: PROP3GET_INIT(TouchLocation, Id)
							, PROP3GET_INIT(TouchLocation, Position)
							, PROP3GET_INIT(TouchLocation, State)
						{
							_Id = id;
							_Position = position;
							_State = state;
						}

						//
						// Summary:
						//     Initializes a new TouchLocation with an ID, and a set of both current and
						//     previous state, position, and pressure values.
						//
						// Parameters:
						//   id:
						//     ID of the new touch location.
						//
						//   state:
						//     State of the new touch location.
						//
						//   position:
						//     Position, in screen coordinates, of the new touch location.
						//
						//   previousState:
						//     Previous state for the new touch location.
						//
						//   previousPosition:
						//     Previous position for the new touch location.
						public: TouchLocation(int id, TouchLocationState state, Vector2 position, TouchLocationState previousState, Vector2 previousPosition)
							: PROP3GET_INIT(TouchLocation, Id)
							, PROP3GET_INIT(TouchLocation, Position)
							, PROP3GET_INIT(TouchLocation, State)
						{
							throw;
						}

						// Summary:
						//     Gets the ID of the touch location.
						public: PROP3_GET(int, Id)
						{
							return _Id;
						}

						//
						// Summary:
						//     Gets the position of the touch location.
						public: PROP3_GET(Vector2, Position)
						{
							return _Position;
						}

						//
						// Summary:
						//     Gets the state of the touch location.
						public: PROP3_GET(TouchLocationState, State)
						{
							return _State;
						}


						// Summary:
						//     Determines whether the current TouchLocation is equal to the specified object.
						//
						// Parameters:
						//   obj:
						//     The Object to compare with the touch location.
						public: override bool Equals(Riccsson::System::object* obj)
						{
							throw;
						}

						//
						// Summary:
						//     Determines whether the current TouchLocation is equal to the specified TouchLocation.
						//
						// Parameters:
						//   other:
						//     The TouchLocation to compare with this instance.
						public: bool Equals(TouchLocation* other)
						{
							throw;
						}

						//
						// Summary:
						//     Gets the hash code for this TouchLocation.
						public: override int GetHashCode()
						{
							throw;
						}

						//
						// Summary:
						//     Gets a string representation of the TouchLocation.
						public: override GC_PTR<Riccsson::System::String> ToString()
						{
							throw;
						}

						//
						// Summary:
						//     Attempts to get the previous location of this touch location object.
						//
						// Parameters:
						//   previousLocation:
						//     [OutAttribute] Previous location data, as a TouchLocation.
						public: bool TryGetPreviousLocation(TouchLocation out previousLocation)
						{
							throw;
						}

					};

					// Summary:
					//     Determines whether two TouchLocation instances are unequal.
					//
					// Parameters:
					//   value1:
					//     The TouchLocation to compare with the second.
					//
					//   value2:
					//     The TouchLocation to compare with the first.
					inline bool operator !=(TouchLocation value1, TouchLocation value2)
					{
						throw;
					}

					//
					// Summary:
					//     Determines whether two TouchLocation instances are equal.
					//
					// Parameters:
					//   value1:
					//     The TouchLocation to compare with the second.
					//
					//   value2:
					//     The TouchLocation to compare with the first.
					inline bool operator ==(TouchLocation value1, TouchLocation value2)
					{
						throw;
					}

				}
			}
		}
	}
}

#endif